--
-- Author: Song Defang
-- Date: 2016-02-23 16:34:30
--
SoraDMsglisteners = {}

function SoraDAddMessage(target,msgDefine,backFunc)
    --查找定义
    local msg = getMessageByDefine(msgDefine)
    if msg == nil then
        return
    end
    
    if SoraDHasMessage(target,msg,backFunc) then
        return
    end

    --操作
    local msgObj = {body = target,func = backFunc}
    if SoraDMsglisteners[msg] == nil then
        SoraDMsglisteners[msg] = {}
    end
    
    table.insert(SoraDMsglisteners[msg], msgObj)
end
function SoraDSendMessage(data, content)
    --查找定义
    local msg = getMessageByDefine(data.msg)
    if msg == nil then
        return
    end
    -- body
    local msgs = SoraDMsglisteners[msg]
    if msgs == nil then
        return
    end
    --添加客户端附加信息
    if content and content.clientData then
        data.clientData = content.clientData
    end

    --dump(data, "data=", 10)
    for i=#msgs,1,-1 do
        local l = msgs[i]
        if l then
            local func = l["func"]
            local body = l["body"]
            func(body,data)
        end
    end
end
function SoraDHasMessage(target,msg,func)
    local msgs = SoraDMsglisteners[msg]
    if msgs then
        for k,v in pairs(msgs) do
            if v["body"] == target or v["func"] == func then
                return true;
            end
        end
    end
    return false
end
--[[
* [SoraDRemoveMessageByName 删除某个消息的所有事件]
* @param  {[type]} msgNa
* @return {[type]}
]]
function SoraDRemoveMessageByName(msgDefine)
    --查找定义
    local msg = getMessageByDefine(msgDefine)
    if msg == nil then
        return
    end
    --操作
    SoraDMsglisteners[msg] = nil
end
--[[
* [SoraDRemoveMessageByTarget 删除某个对象的所有事件]
* @param  {[type]} target
* @return {[type]}
]]
function SoraDRemoveMessageByTarget(target)
    -- body
    for i,j in pairs(SoraDMsglisteners) do
        for k,l in pairs(j) do        
            local tempTarget = l["body"]
            if tempTarget == target then
                table.remove(j, k)
            end
        end
    end
end
--[[
* [SoraDRemoveMessageFromTargetByName 删除某个对象的某个事件]
* @param  {[type]} target
* @param  {[type]} msg
* @return {[type]}
]]
function SoraDRemoveMessageFromTargetByName(target,msgDefine)
    --查找定义
    local msg = getMessageByDefine(msgDefine)
    if msg == nil then
        return
    end
    --操作
    local msgs = SoraDMsglisteners[msg]
    if msgs then
        for k,v in pairs(msgs) do
            if v["body"] == target then
                table.remove(msgs, k)
            end
        end
    end
end
function SorDRemoveAllMessage( ... )
    -- body
    SoraDMsglisteners = {}
end